package com.heima.behavior.config;

import com.heima.model.user.pojos.ApUser;
import com.heima.utils.common.AppJwtUtil;
import com.heima.utils.thread.AppThreadLocalUtil;
import io.jsonwebtoken.Claims;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Optional;

/**
 * 在当前微服务中的自定义拦截器，目的是为了从请求头中获取token,并找到用户id，然后把用户id保存到当前线程中
 */
public class ApTokenInterceptor implements HandlerInterceptor {
    /**
     * 在目的方法之前执行执行该方法拦截
     * @param request
     * @param response
     * @param handler
     * @return
     * @throws Exception
     */
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        //1.从请求头对象中获取token
        String token = request.getHeader("token");

        Optional<String> optional = Optional.ofNullable(token);
        if (optional.isPresent()){//如果有数据
            //2.解析token获取用户id
            Claims claimsBody = AppJwtUtil.getClaimsBody(token);
            Object userId = claimsBody.get("id");
            //3.吧用户信息保存到threadLocal中
            ApUser apUser=new ApUser();
            apUser.setId((Integer) userId);
            AppThreadLocalUtil.setApUser(apUser);
        }
        //4.放行
        return true;
    }

    /**
     * 在目的方法执行之后执行该方法拦截
     * @param request
     * @param response
     * @param handler
     * @param modelAndView
     * @throws Exception
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        //清理当前threadlocal中的缓存信息
       AppThreadLocalUtil.delApUser();
    }
}
